跳到主要内容

63 二叉树中的结点插入操作

  • 需要考虑的问题 是否能在二叉树的任意结点处插入子结点? 是否需要指定新数据元素(新结点)的插入位置?

  • 二叉树结点的位置枚举类型

    enum BTNodePos{
    ANY,
    LEFT,
    RIGHT
    };
  • 插入的方式

    • 插入的新结点 bool insert(TreeNode<T> *node) bool insert(TreeNode<T> *node,BTNodePos pos)
    • 插入数据元素 bool insert(const T &value,TreeNode<T> *parent) bool insert(const T &value,TreeNode<T> *parent,BTNodePos pos)
  • 新结点的插入

  • 指定位置的结点插入 bool insert(n,np,pos)

    //pos=ANY
    if(np->left==nullptr){
    np->left=n;
    }
    else if(np->right==nullptr){
    np->right=n;
    }
    else{
    ret = false;
    }
    //pos=LEFT
    if(np->left==nullptr){
    np->left = n;
    }
    else{
    ret = false;
    }
    //pos=RIGHT
    if(np->right=nullptr){
    np->right=n;
    }
    else{
    ret = false;
    }
  • 插入新结点

  • 插入数据元素

编程实验

  • 二叉树的插入操作

小结

  • 二叉树的插入操作需要指明插入的位置
  • 插入操作必须正确处理指向父结点的指针
  • 插入数据元素时需要从堆空间中创建结点
  • 当数据元素插入失败时需要释放结点空间

思考:如何实现BTree(二叉树结构)的结点删除操作和清除操作?

64 二叉树中的结点删除与清除

二叉树中的结点删除

  • 删除的方式

    • 基于数据元素值的删除SharedPointer<Tree<T>> remove(const T &value)
    • 基于结点的删除SharedPointer<Tree<T>> remove(TreeNode<T> *node)
  • 二叉树中结点的删除

  • 删除操作功能的定义

    • void remove(BTreeNode<T> *node,BTree<T>* &ret)
      • 将node为根结点的子树从原来的二叉树中删除
      • ret作为子树返回(ret指向堆空间中的二叉树对象)
  • 删除功能函数的实现

编程实验

  • 二叉树结点的删除操作

二叉树中的结点清除

  • 清除操作的定义

    • void clear()
      • 将二叉树中的所有结点清除(释放堆中的结点)
  • 二叉树中结点的清楚

  • 清除操作功能的定义

    • free(node)
      • 清除node为根结点的二叉树
      • 释放二叉树中的每一个结点

编程实验

  • 清除二叉树中的结点

小结

  • 删除操作将目标结点所代表的子树移除
  • 删除操作必须完善处理父结点和子结点的关系
  • 清除操作用于销毁树中的每一个结点
  • 销毁结点时判断是否释放对应的内存空间(工厂模式)